package com.example.domain.dto.cart;

import com.example.domain.dto.MoneyDTO;
import com.example.domain.entity.Cart;
import com.example.domain.entity.enums.CartStatus;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 购物车DTO
 * 
 * @author Means
 * @since 2025-10-27
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class CartDTO {
    
    /**
     * 购物车ID
     */
    private String id;
    
    /**
     * 用户ID（可选）
     */
    private String userId;
    
    /**
     * 会话ID（可选，用于匿名用户）
     */
    private String sessionId;
    
    /**
     * 购物车状态
     */
    private CartStatus status;
    
    /**
     * 状态描述
     */
    private String statusDesc;
    
    /**
     * 购物车商品项列表
     */
    private List<CartItemDTO> items;
    
    /**
     * 商品项数量
     */
    private Integer itemCount;
    
    /**
     * 商品总数量（所有商品的数量之和）
     */
    private String totalQuantity;
    
    /**
     * 小计金额（不含折扣）
     */
    private MoneyDTO subtotal;
    
    /**
     * 折扣金额
     */
    private MoneyDTO discount;
    
    /**
     * 单品折扣合计
     */
    private MoneyDTO itemDiscount;
    
    /**
     * 满减折扣合计
     */
    private MoneyDTO thresholdDiscount;
    
    /**
     * 促销摘要（如：满100减10 已减10.00元）
     */
    private String promotionSummary;
    
    /**
     * 应付总额
     */
    private MoneyDTO total;
    
    /**
     * 创建时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createdAt;
    
    /**
     * 更新时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updatedAt;
    
    /**
     * 从实体类创建DTO（基础版本，不包含商品项）
     * 
     * @param cart 购物车实体
     * @return CartDTO
     */
    public static CartDTO from(Cart cart) {
        if (cart == null) {
            return null;
        }
        
        return CartDTO.builder()
                .id(cart.getId())
                .userId(cart.getUserId())
                .sessionId(cart.getSessionId())
                .status(cart.getStatus())
                .statusDesc(getStatusDescription(cart.getStatus()))
                .createdAt(cart.getCreatedAt())
                .updatedAt(cart.getUpdatedAt())
                .build();
    }
    
    /**
     * 获取状态描述
     * 
     * @param status 购物车状态
     * @return 状态描述
     */
    private static String getStatusDescription(CartStatus status) {
        if (status == null) {
            return null;
        }
        switch (status) {
            case ACTIVE:
                return "活跃";
            case CHECKED_OUT:
                return "已结算";
            case EXPIRED:
                return "已过期";
            default:
                return status.name();
        }
    }
}

